package com.carlinfo.shop.common.util;

import java.io.IOException;
import java.util.Iterator;
import java.util.Random;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * 京东的蜘蛛
 * @author wangshMac
 *
 */
public class JdSpider
{
	/**
	 * 查询指定分类下面的商品
	 * @param cate
	 * @return 
	 * 主要是将抓取的信息存储下来;让调用者使用
{
	"code":"0",
	"info":"",
	"data":
	{
		"pageInfo":
		{
			"totalPage":"",
			"pageSize":""
		},
		"goods":
		[
			{"name":"","imgPath":"","price":""}
		]
	}
}
	 */
	public JSONObject goodsList(String cate,String ev,int page)
	{
		JSONObject resultJSON = new JSONObject() ; 
		if(page < 1)
		{
			/* 当前页修正 */
			page = 1 ; 
		}
		String url = "https://list.jd.com/list.html?cat="+ cate +"&ev="+ ev +"&page=" + page;
		
		Random random = new Random() ; 
		ConstatFinalUtil.LOGGER.info("url:{}",url);
		try
		{
			Connection connection = Jsoup.connect(url);
			Document document = connection.get() ;
			/* 在真正测试的时候一定要把此内容注释掉 */
			/*ConstatFinalUtil.LOGGER.info("--document->{}",document);*/
			/* 获取总页数 */
			Element pageEle = document.getElementById("J_topPage");
			/* id为J_topPage下面的第一个span,下面的第一个i */
			Element totalPageEle = pageEle.getElementsByTag("span").get(0).getElementsByTag("i").get(0);
			String totalPage = totalPageEle.text() ; 
			//ConstatFinalUtil.LOGGER.info("总页数:{}",totalPage);
			/* 准备总页数 */
			JSONObject pageInfoJSON = new JSONObject() ; 
			pageInfoJSON.put("totalPage", totalPage);
			pageInfoJSON.put("pageSize", "60");
			
			/* 取出所有的商品 */
			Element plistEle = document.getElementById("plist");
			/* 只能获取子标签 */
			/*plistEle.children()*/
			/* 找所有后代指定的标签 */
			Elements liEles = plistEle.getElementsByClass("gl-item");
			//ConstatFinalUtil.LOGGER.info("商品的数量:{}",liEles.size());
			
			JSONArray goodsArr = new JSONArray() ; 
			/* 循环取出商品 */
			for (Iterator iterator = liEles.iterator(); iterator.hasNext();)
			{
				Element goodsTemp = (Element) iterator.next();
				/* 取出商品的哪些内容 */
				Elements titleEles = goodsTemp.getElementsByClass("p-name");
				/* 有的时候使用开发工具看到的结构和爬虫取回来的结构不一样;
				 * 以爬虫取回的数据为准;因为有些数据是经过js操作的 */
				/* a链接 */
				Element titleEle = titleEles.get(0).getElementsByTag("a").get(0);
				/* a链接 */
				String href = titleEle.attr("href").replaceAll("//", "") ; 
				/* 名字 */
				String name = titleEle.text() ; 
				
				
				/* 图片 */
				/* 取出商品的哪些内容 */
				Elements imgEles = goodsTemp.getElementsByClass("p-img");
				/* 有的时候使用开发工具看到的结构和爬虫取回来的结构不一样;
				 * 以爬虫取回的数据为准;因为有些数据是经过js操作的 */
				/* 图片有多个,要想办法取最后一个 
				 * */
				imgEles = imgEles.get(0).getElementsByTag("img");
				String imgPath = "" ; 
				for (Iterator iterator2 = imgEles.iterator(); iterator2.hasNext();)
				{
					Element imgEle = (Element) iterator2.next();
					String imgPathTemp = imgEle.attr("src").replaceAll("//", "");
					if(imgPathTemp.endsWith(".png") || "".equalsIgnoreCase(imgPathTemp))
					{
						imgPathTemp = imgEle.attr("data-lazy-img").replaceAll("//", "");
					}
					if(imgPathTemp.endsWith(".jpg"))
					{
						imgPath = imgPathTemp ; 
						break ; 
					}
				}
				
				/* 由于价格无法获取,我们随机 */
				String price = random.nextInt(100) * 10 + "" ; 
				//ConstatFinalUtil.LOGGER.info("名字:{},图片:{},价格:{},链接:{}",name,imgPath,price,href);
				/*"href":"item.jd.com/4935731.html"*/
				String id = href.substring(href.lastIndexOf("/") + 1, href.lastIndexOf("."));
				
				/* 存储结果到json中 */
				JSONObject goodsJSON = new JSONObject() ; 
				goodsJSON.put("name", name);
				goodsJSON.put("imgPath", imgPath);
				goodsJSON.put("price", price);
				goodsJSON.put("href", href);
				goodsJSON.put("id", id);
				
				/* 存储结果到json中 */
				goodsArr.add(goodsJSON);
			}
			
			JSONObject dataJSON = new JSONObject() ; 
			dataJSON.put("pageInfo", pageInfoJSON);
			dataJSON.put("goods", goodsArr);
			
			resultJSON.put("data", dataJSON);
			
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
		} catch (Exception e)
		{
			ConstatFinalUtil.LOGGER.info("抓取京东抛异常了,url:{}",url,e);
			resultJSON.put("code", "-1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("-1") + e.toString());
		} 
		return resultJSON ; 
	}
	
	public static void main(String[] args)
	{
		JdSpider jdSpider = new JdSpider();
		String cate = "737,794,870" ; 
		String ev = "";
		JSONObject resultJSON = jdSpider.goodsList(cate ,ev, 3);
		System.out.println("====>" + resultJSON);
	}
}
